//!! continuous value double LS::RegressionRepresentation::evaluate_representation(const McLmm_LS::LMMSimulationResult& lmmSimulationResult)const // conditional expectation { evaluate_basis(lmmSimulationResult); double result = 0.0; for(size_t i=0; i<basis_.size(); ++i) { result += basis_val_buffer_[i]*regressionCoeffs_[i]; } return result; }
/// Evaluate all basis functions at given point x in cell void poisson2d_1_finite_element_0::evaluate_basis_all(double* values, const double* x, const double* vertex_coordinates, int cell_orientation) const { // Helper variable to hold values of a single dof. double dof_values = 0.0; // Loop dofs and call evaluate_basis for (unsigned int r = 0; r < 3; r++) { evaluate_basis(r, &dof_values, x, vertex_coordinates, cell_orientation); values[r] = dof_values; }// end loop over 'r' }
void LS::RegressionRepresentation::evaluate_basis(const McLmm_LS::LMMSimulationResult& lmmSimulationResult)const { evaluate_basis(lmmSimulationResult.get_liborMatrix(), lmmSimulationResult.get_numeraire()); }
/// Evaluate order n derivatives of basis function i at given point x in cell void poisson2d_1_finite_element_0::evaluate_basis_derivatives(std::size_t i, std::size_t n, double* values, const double* x, const double* vertex_coordinates, int cell_orientation) const { // Compute number of derivatives. unsigned int num_derivatives = 1; for (unsigned int r = 0; r < n; r++) { num_derivatives *= 2; }// end loop over 'r' // Reset values. Assuming that values is always an array. for (unsigned int r = 0; r < num_derivatives; r++) { values[r] = 0.0; }// end loop over 'r' // Call evaluate_basis if order of derivatives is equal to zero. if (n == 0) { evaluate_basis(i, values, x, vertex_coordinates, cell_orientation); return ; } // If order of derivatives is greater than the maximum polynomial degree, return zeros. if (n > 1) { return ; } // Compute Jacobian double J[4]; compute_jacobian_triangle_2d(J, vertex_coordinates); // Compute Jacobian inverse and determinant double K[4]; double detJ; compute_jacobian_inverse_triangle_2d(K, detJ, J); // Compute constants const double C0 = vertex_coordinates[2] + vertex_coordinates[4]; const double C1 = vertex_coordinates[3] + vertex_coordinates[5]; // Get coordinates and map to the reference (FIAT) element double X = (J[1]*(C1 - 2.0*x[1]) + J[3]*(2.0*x[0] - C0)) / detJ; double Y = (J[0]*(2.0*x[1] - C1) + J[2]*(C0 - 2.0*x[0])) / detJ; // Declare two dimensional array that holds combinations of derivatives and initialise unsigned int combinations[2][1]; for (unsigned int row = 0; row < 2; row++) { for (unsigned int col = 0; col < 1; col++) combinations[row][col] = 0; } // Generate combinations of derivatives for (unsigned int row = 1; row < num_derivatives; row++) { for (unsigned int num = 0; num < row; num++) { for (unsigned int col = n-1; col+1 > 0; col--) { if (combinations[row][col] + 1 > 1) combinations[row][col] = 0; else { combinations[row][col] += 1; break; } } } } // Compute inverse of Jacobian const double Jinv[2][2] = {{K[0], K[1]}, {K[2], K[3]}}; // Declare transformation matrix // Declare pointer to two dimensional array and initialise double transform[2][2]; for (unsigned int j = 0; j < num_derivatives; j++) { for (unsigned int k = 0; k < num_derivatives; k++) transform[j][k] = 1; } // Construct transformation matrix for (unsigned int row = 0; row < num_derivatives; row++) { for (unsigned int col = 0; col < num_derivatives; col++) { for (unsigned int k = 0; k < n; k++) transform[row][col] *= Jinv[combinations[col][k]][combinations[row][k]]; } } switch (i) { case 0: { // Array of basisvalues double basisvalues[3] = {0.0, 0.0, 0.0}; // Declare helper variables double tmp0 = (1.0 + Y + 2.0*X)/2.0; // Compute basisvalues basisvalues[0] = 1.0; basisvalues[1] = tmp0; basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); basisvalues[0] *= std::sqrt(0.5); basisvalues[2] *= std::sqrt(1.0); basisvalues[1] *= std::sqrt(3.0); // Table(s) of coefficients static const double coefficients0[3] = \ {0.471404520791032, -0.288675134594813, -0.166666666666667}; // Tables of derivatives of the polynomial base (transpose). static const double dmats0[3][3] = \ {{0.0, 0.0, 0.0}, {4.89897948556636, 0.0, 0.0}, {0.0, 0.0, 0.0}}; static const double dmats1[3][3] = \ {{0.0, 0.0, 0.0}, {2.44948974278318, 0.0, 0.0}, {4.24264068711928, 0.0, 0.0}}; // Compute reference derivatives. // Declare array of derivatives on FIAT element. double derivatives[2]; for (unsigned int r = 0; r < 2; r++) { derivatives[r] = 0.0; }// end loop over 'r' // Declare derivative matrix (of polynomial basis). double dmats[3][3] = \ {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}}; // Declare (auxiliary) derivative matrix (of polynomial basis). double dmats_old[3][3] = \ {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}}; // Loop possible derivatives. for (unsigned int r = 0; r < num_derivatives; r++) { // Resetting dmats values to compute next derivative. for (unsigned int t = 0; t < 3; t++) { for (unsigned int u = 0; u < 3; u++) { dmats[t][u] = 0.0; if (t == u) { dmats[t][u] = 1.0; } }// end loop over 'u' }// end loop over 't' // Looping derivative order to generate dmats. for (unsigned int s = 0; s < n; s++) { // Updating dmats_old with new values and resetting dmats. for (unsigned int t = 0; t < 3; t++) { for (unsigned int u = 0; u < 3; u++) { dmats_old[t][u] = dmats[t][u]; dmats[t][u] = 0.0; }// end loop over 'u' }// end loop over 't' // Update dmats using an inner product. if (combinations[r][s] == 0) { for (unsigned int t = 0; t < 3; t++) { for (unsigned int u = 0; u < 3; u++) { for (unsigned int tu = 0; tu < 3; tu++) { dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u]; }// end loop over 'tu' }// end loop over 'u' }// end loop over 't' } if (combinations[r][s] == 1) { for (unsigned int t = 0; t < 3; t++) { for (unsigned int u = 0; u < 3; u++) { for (unsigned int tu = 0; tu < 3; tu++) { dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u]; }// end loop over 'tu' }// end loop over 'u' }// end loop over 't' } }// end loop over 's' for (unsigned int s = 0; s < 3; s++) { for (unsigned int t = 0; t < 3; t++) { derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t]; }// end loop over 't' }// end loop over 's' }// end loop over 'r' // Transform derivatives back to physical element for (unsigned int r = 0; r < num_derivatives; r++) { for (unsigned int s = 0; s < num_derivatives; s++) { values[r] += transform[r][s]*derivatives[s]; }// end loop over 's' }// end loop over 'r' break; } case 1: { // Array of basisvalues double basisvalues[3] = {0.0, 0.0, 0.0}; // Declare helper variables double tmp0 = (1.0 + Y + 2.0*X)/2.0; // Compute basisvalues basisvalues[0] = 1.0; basisvalues[1] = tmp0; basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); basisvalues[0] *= std::sqrt(0.5); basisvalues[2] *= std::sqrt(1.0); basisvalues[1] *= std::sqrt(3.0); // Table(s) of coefficients static const double coefficients0[3] = \ {0.471404520791032, 0.288675134594813, -0.166666666666667}; // Tables of derivatives of the polynomial base (transpose). static const double dmats0[3][3] = \ {{0.0, 0.0, 0.0}, {4.89897948556636, 0.0, 0.0}, {0.0, 0.0, 0.0}}; static const double dmats1[3][3] = \ {{0.0, 0.0, 0.0}, {2.44948974278318, 0.0, 0.0}, {4.24264068711928, 0.0, 0.0}}; // Compute reference derivatives. // Declare array of derivatives on FIAT element. double derivatives[2]; for (unsigned int r = 0; r < 2; r++) { derivatives[r] = 0.0; }// end loop over 'r' // Declare derivative matrix (of polynomial basis). double dmats[3][3] = \ {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}}; // Declare (auxiliary) derivative matrix (of polynomial basis). double dmats_old[3][3] = \ {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}}; // Loop possible derivatives. for (unsigned int r = 0; r < num_derivatives; r++) { // Resetting dmats values to compute next derivative. for (unsigned int t = 0; t < 3; t++) { for (unsigned int u = 0; u < 3; u++) { dmats[t][u] = 0.0; if (t == u) { dmats[t][u] = 1.0; } }// end loop over 'u' }// end loop over 't' // Looping derivative order to generate dmats. for (unsigned int s = 0; s < n; s++) { // Updating dmats_old with new values and resetting dmats. for (unsigned int t = 0; t < 3; t++) { for (unsigned int u = 0; u < 3; u++) { dmats_old[t][u] = dmats[t][u]; dmats[t][u] = 0.0; }// end loop over 'u' }// end loop over 't' // Update dmats using an inner product. if (combinations[r][s] == 0) { for (unsigned int t = 0; t < 3; t++) { for (unsigned int u = 0; u < 3; u++) { for (unsigned int tu = 0; tu < 3; tu++) { dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u]; }// end loop over 'tu' }// end loop over 'u' }// end loop over 't' } if (combinations[r][s] == 1) { for (unsigned int t = 0; t < 3; t++) { for (unsigned int u = 0; u < 3; u++) { for (unsigned int tu = 0; tu < 3; tu++) { dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u]; }// end loop over 'tu' }// end loop over 'u' }// end loop over 't' } }// end loop over 's' for (unsigned int s = 0; s < 3; s++) { for (unsigned int t = 0; t < 3; t++) { derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t]; }// end loop over 't' }// end loop over 's' }// end loop over 'r' // Transform derivatives back to physical element for (unsigned int r = 0; r < num_derivatives; r++) { for (unsigned int s = 0; s < num_derivatives; s++) { values[r] += transform[r][s]*derivatives[s]; }// end loop over 's' }// end loop over 'r' break; } case 2: { // Array of basisvalues double basisvalues[3] = {0.0, 0.0, 0.0}; // Declare helper variables double tmp0 = (1.0 + Y + 2.0*X)/2.0; // Compute basisvalues basisvalues[0] = 1.0; basisvalues[1] = tmp0; basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); basisvalues[0] *= std::sqrt(0.5); basisvalues[2] *= std::sqrt(1.0); basisvalues[1] *= std::sqrt(3.0); // Table(s) of coefficients static const double coefficients0[3] = \ {0.471404520791032, 0.0, 0.333333333333333}; // Tables of derivatives of the polynomial base (transpose). static const double dmats0[3][3] = \ {{0.0, 0.0, 0.0}, {4.89897948556636, 0.0, 0.0}, {0.0, 0.0, 0.0}}; static const double dmats1[3][3] = \ {{0.0, 0.0, 0.0}, {2.44948974278318, 0.0, 0.0}, {4.24264068711928, 0.0, 0.0}}; // Compute reference derivatives. // Declare array of derivatives on FIAT element. double derivatives[2]; for (unsigned int r = 0; r < 2; r++) { derivatives[r] = 0.0; }// end loop over 'r' // Declare derivative matrix (of polynomial basis). double dmats[3][3] = \ {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}}; // Declare (auxiliary) derivative matrix (of polynomial basis). double dmats_old[3][3] = \ {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}}; // Loop possible derivatives. for (unsigned int r = 0; r < num_derivatives; r++) { // Resetting dmats values to compute next derivative. for (unsigned int t = 0; t < 3; t++) { for (unsigned int u = 0; u < 3; u++) { dmats[t][u] = 0.0; if (t == u) { dmats[t][u] = 1.0; } }// end loop over 'u' }// end loop over 't' // Looping derivative order to generate dmats. for (unsigned int s = 0; s < n; s++) { // Updating dmats_old with new values and resetting dmats. for (unsigned int t = 0; t < 3; t++) { for (unsigned int u = 0; u < 3; u++) { dmats_old[t][u] = dmats[t][u]; dmats[t][u] = 0.0; }// end loop over 'u' }// end loop over 't' // Update dmats using an inner product. if (combinations[r][s] == 0) { for (unsigned int t = 0; t < 3; t++) { for (unsigned int u = 0; u < 3; u++) { for (unsigned int tu = 0; tu < 3; tu++) { dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u]; }// end loop over 'tu' }// end loop over 'u' }// end loop over 't' } if (combinations[r][s] == 1) { for (unsigned int t = 0; t < 3; t++) { for (unsigned int u = 0; u < 3; u++) { for (unsigned int tu = 0; tu < 3; tu++) { dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u]; }// end loop over 'tu' }// end loop over 'u' }// end loop over 't' } }// end loop over 's' for (unsigned int s = 0; s < 3; s++) { for (unsigned int t = 0; t < 3; t++) { derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t]; }// end loop over 't' }// end loop over 's' }// end loop over 'r' // Transform derivatives back to physical element for (unsigned int r = 0; r < num_derivatives; r++) { for (unsigned int s = 0; s < num_derivatives; s++) { values[r] += transform[r][s]*derivatives[s]; }// end loop over 's' }// end loop over 'r' break; } } }
HaWpBasisVector<N> evaluate_basis(RMatrix<D,N> const& rgrid) const { CMatrix<D,N> cgrid = rgrid.template cast <complex_t>(); return evaluate_basis(cgrid); }